/*
 * @Descripttion: 
 * @version: 
 * @Author: Miller Zhou
 * @Date: 2021-02-21 14:13:07
 * @LastEditors: Miller Zhou
 * @LastEditTime: 2021-02-21 14:55:44
 */
#include "Zkeypad.h"
#include "main.h"
#include "ZcommonDrv.h"


#define Key_Column_1_out_LOW HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_RESET) 
#define Key_Column_2_out_LOW HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,GPIO_PIN_RESET) 
#define Key_Column_3_out_LOW HAL_GPIO_WritePin(GPIOE,GPIO_PIN_9,GPIO_PIN_RESET) 
#define Key_Column_4_out_LOW HAL_GPIO_WritePin(GPIOE,GPIO_PIN_10,GPIO_PIN_RESET) 

#define Key_Column_1_out_HIGH HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_SET) 
#define Key_Column_2_out_HIGH HAL_GPIO_WritePin(GPIOE,GPIO_PIN_8,GPIO_PIN_SET) 
#define Key_Column_3_out_HIGH HAL_GPIO_WritePin(GPIOE,GPIO_PIN_9,GPIO_PIN_SET) 
#define Key_Column_4_out_HIGH HAL_GPIO_WritePin(GPIOE,GPIO_PIN_10,GPIO_PIN_SET) 

#ifdef mcu_stm32f4_hal
uint8_t Key_row[1] = {0xff};

char KEY_ROW_SCAN(void)
{
    Key_row[0] = HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)<<3;
    Key_row[0] = Key_row[0] | (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)<<2);
    Key_row[0] = Key_row[0] | (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_5)<<1);
    Key_row[0] = Key_row[0] | (HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_6));
    
    if(Key_row[0] != 0x0f)
    {
      Z_delay_ms(10);                   
      if(Key_row[0] != 0x0f)
        {   
                switch(Key_row[0])
                {
                    case 0x07:         //0111 column 1 be detected to be pressed
                        return 1;
                    case 0x0b:         //1011 column 2 be detected to be pressed
                        return 2;
                    case 0x0d:         //1101 column 3 be detected to be pressed
                        return 3;
                    case 0x0e:         //1110 column 4 be detected to be pressed
                        return 4;
                    default :
                        return 0;
                }
        }
        else return 0;
    }
    else return 0;
}


char KEY_SCAN(void)
{    
    char Key_Num=0;     
    char Key_row_num=0;       
    
    /*Scan the value of row 1*/
    Key_Column_1_out_LOW; 
    if ( (Key_row_num=KEY_ROW_SCAN()) != 0 )
    { 
        while(KEY_ROW_SCAN() != 0);  
        Key_Num = 0 + Key_row_num;
    }
    Key_Column_1_out_HIGH; 
    
    /*Scan the value of row 2*/
    Key_Column_2_out_LOW;       
    if ( (Key_row_num=KEY_ROW_SCAN()) != 0 )
    { 
        while(KEY_ROW_SCAN() != 0);
        Key_Num = 4 + Key_row_num;
    }
    Key_Column_2_out_HIGH; 
    
    /*Scan the value of row 3*/
    Key_Column_3_out_LOW;       
    if ( (Key_row_num=KEY_ROW_SCAN()) != 0 )
    { 
        while(KEY_ROW_SCAN() != 0);
        Key_Num = 8 + Key_row_num;
    }
    Key_Column_3_out_HIGH; 
    
    /*Scan the value of row 4*/
    Key_Column_4_out_LOW;       
    if ( (Key_row_num=KEY_ROW_SCAN()) != 0 )
    {
        while(KEY_ROW_SCAN() != 0);
        Key_Num = 12 + Key_row_num;
    }
    Key_Column_4_out_LOW; 
    
    return Key_Num;
}

#endif